In this notebook we determine which of the integer slopes of the Baker-Luecke knots admit OSBs.

In [1]:
##This is code that will search for an obtuse superbase
##in an integer CM lattice. Input is a list of
##coefficients for CM lattice.

from itertools import combinations
import numpy as np
import time
import csv

def norm(v):
    return sum([z*z for z in v])

def irred_check(v,vtest):
    #Computes T=(v-vtest).vtest returns true if this does not prove
    #that v is reducible. I.e returns true if T<0 or vtest=0 or v=vtest.

    T=sum([(v[i]-vtest[i])*vtest[i] for i in range(0,len(v))])
    if T<0:
        return True

    if T==0:
        if sum([z*z for z in vtest])==0:
            return True
        if sum([(v[i]-vtest[i])*(v[i]-vtest[i]) for i in range(0,len(v))])==0:
            return True
    return False

def irred_bounds(sigma):
    #Provide bounds on the coefficients of an irreducible
    #in a changemaker lattice.
    n=len(sigma)
    vmax=[0]*n
    
    #Check if sigma is tight
    tight=False
    for i in range(1,n):
        if sigma[i]> sum([sigma[j] for j in range(0,i)]):
            tight=True
            break

    if tight:
        vmax[0]=2
    else:
        vmax[0]=1
    
    for i in range(1, len(sigma)):
        if sigma[i]==sigma[i-1]:
            vmax[i]=vmax[i-1]
        else:
            #If sigma[i] tight.
            if sigma[i]> sum([sigma[j] for j in range(0,i)]):
                vmax[i]=6+sum([vmax[j]+1 for j in range(0,i)])
                vmax[i]=min(vmax[i], sigma[i]*(sigma[i]+2))
            else:
                T=sigma[i]
                j=i-1
                while T>0:
                    j=max([k for k in range(0,j+1) if sigma[k]<=T])
                    vmax[i]=vmax[i]+vmax[j]+1
                    T-=sigma[j]
                    
    #print(vmax)
    return(vmax)

def irred_generator(sigma, vmax):
    n=len(sigma)
    v=[-vmax[i] for i in range(0,n)]
    k=0
    while True:
        #Check whether there is a choice final coordinate to
        #put vector in CM lattice. If so, yield that vector.
        t= sum([sigma[i]*v[i] for i in range(0,n-1)])
        if t%sigma[-1]==0:
            v[-1]=-t//sigma[-1]
            if v[-1]>=-vmax[-1] and v[-1]<=vmax[-1]:
                yield v
        #Now increment v.
        while k<n-1 and v[k]+1>vmax[k]:
            v[k]=-vmax[k]
            k=k+1
        if k<n-1:
            v[k]+=1
            k=0
        else:
            break
    
def list_irreducibles(sigma, quick=False):
    ##generate a list of irreducible elements of a CM lattice.
    #This version uses the generator function irred_generator.

    p=norm(sigma)
    n=len(sigma)
    irred_list=[]

    #Vector defining the bounds on the search space
    vmax=irred_bounds(sigma)
    if quick:
        vmax=[min(2, vmax[i]) for i in range(0,n)]
    
    for v in irred_generator(sigma,vmax):
        v_irred_flag=True
        for vtest in irred_list:
            if irred_check(v,vtest)==False:
                v_irred_flag=False
                break
        #if v is potentially irreducible, we use it filter out any
        #non-irreducibles in irred_list and add it to irred_list.
        if v_irred_flag:
            irred_list=[w for w in irred_list if irred_check(w,v)]
            irred_list+=[list(v)]

    return irred_list                    

def OSB_search(sigma, quick=False, verbose=False):
    ##Search for an obtuse superbase. Function returns an OSB
    #if it finds one. Returns false otherwise. The optional flag quick
    ##can be used to accelerate the search. When true the flag restricts
    ##the search of irreducibles to vectors with coefficients at most 2.
    ##Conjecturally, this is should still always find an OSB if it exists.
    ##
    ##This implementation is improved
    ## adding norm 2 vertices to the basis at the start

    ##

    if verbose:
        print("------")
        if quick:
            print("Accelerated search.")
        else:
            print("Standard search.")
        print("sigma="+ str(sigma))
        
        
    start_time = time.time()
    p=norm(sigma)
    n=len(sigma)

    #Create a list of norm 2 vectors that we will put in our basis.
    norm2_vertices=[]
    for i in range(1,n):
        if sigma[i]==sigma[i-1]:
            z=[0]*n
            z[i]=1
            z[i-1]=-1
            norm2_vertices+=[list(z)]

    #Filter our set of irreducibles by picking those with norm >2 and
    #pairing 0 or -1 with the norm two vectors
    vertex_pool=[]
    for z in list_irreducibles(sigma,quick):
        if len(norm2_vertices)==0 and norm(z)>0:
            vertex_pool+=[z]
        elif norm(z)>2:
            t=[sum([w[i]*z[i] for i in range(0,n)]) for w in norm2_vertices]
            if min(t)>=-1 and max(t)<=0:
                vertex_pool+=[z]

    #Now consider all possible combinations of vertices.
    #Uses combinations from itertools package.
    for t in combinations(vertex_pool,n-len(norm2_vertices)-1):
        vertex_list=norm2_vertices+list(t)
        M=np.asarray(vertex_list)
        
        #Calculate intersection matrix
        Q=np.matmul(M,M.transpose())
        
        #Check that the obtuse conditions are satisfied.
        obtuse_flag=True
        if min(sum(Q))<0:
            obtuse_flag =False
        
        for i in range(0,n-1):
            for j in range(0,i):
                if Q[i,j]>0:
                    obtuse_flag=False
                    break
        
        #Check that this is a basis by computing determinant of Q.
        #The det function in numpy doesn't seem to do integer
        #calculations.
        det=np.linalg.det(Q)
        if obtuse_flag and det>p-0.5 and det<p+0.5:
            if verbose:
                print(vertex_list)
                print(Q)
                print(det)
                print("--- Time taken: %s seconds ---" % (time.time() - start_time))
            return vertex_list

    if verbose:
        print("No OSB found.")
        print("--- Time taken: %s seconds ---" % (time.time() - start_time))
    return False

def admits_alt_surg(stable_coefs):
    ##Input the stable coefficients. Return True if
    ##a CM lattice with these coefficients has an OSB
    ##returns False otherwise.
    start_time = time.time()
    
    stable=sorted(stable_coefs)
    print(stable)

    for sigma in [[1]*i+[1]*(stable[0]-1)+stable for i in range(0,3)]:
        #Check that each sigma satisfies CM condition
        n=norm(sigma)
        CM_flag=True
        for i in range(1,len(sigma)):
            if sigma[i]> 1+sum([sigma[j] for j in range(0,i)]):
                CM_flag=False

        n=norm(sigma)
        if CM_flag:
            if OSB_search(sigma)!=False:
                print(str(n)+"-CM lattice has OSB")
            else:
                print(str(n)+"-CM lattice has no OSB")
    print("--- Time taken: %s seconds ---" % (time.time() - start_time))

            
#admits_alt_surg([2,2,2,3,6])
#-----
#Benchmark set 1
#sigma=[1,1,3,3,4,5]
#sigma=[1,1,1,3,3,4,5]
#sigma=[1,1,1,1,3,3,4,5]
#-----
#Benchmark set 2
#sigma=[1,2,2,2,3,6]
#sigma=[1,1,2,2,2,3,6]
#sigma=[1,1,1,2,2,2,3,6]
#-----
#sigma=[1,1,1,2,2,6]
#OSB_search(sigma, verbose=True)
#OSB_search(sigma,quick=True, verbose=True)

##This is code that will search for an obtuse superbase
##in an integer CM lattice. Input is a list of
##coefficients for CM lattice.

from itertools import combinations
import numpy as np
import time
import math

def is_tight(sigma):
    #Check whether a CM lattice has a tight index.
    for i in range(1,len(sigma)):
        if sigma[i]==1+ sum([sigma[j] for j in range(0,i)]):
            return True
    return False

def is_CM(sigma):
    ##Check the vector satisfies the CM condition
    for i in range(1,len(sigma)):
        if sigma[i]> 1+sum([sigma[j] for j in range(0,i)]):
            return False
    return True

def stable_is_decomposable(stable_coefs):
    #Check whether any changemaker lattice associated to a set of stable
    #coefficients can possibly be decomposable
    stable=sorted(stable_coefs)
    
    return is_decomposable([1]*stable[0]+stable)

def is_decomposable(sigma):
    #Check whether a given changemaker lattice
    #is decomposable.
    ##Uses Greene's algorithm of calculating the standard
    ##basis elements and checking that their intersection
    ##graph is connected.
    if is_tight(sigma) or not is_CM(sigma):
        return False

    STD_basis=[]
    n=len(sigma)
    for i in range(1,n):
        v=[0]*n
        v[i]=-1
        T=sigma[i]
        j=i
        while T>0:
            j=max([k for k in range(0,j) if sigma[k]<=T])
            v[j]=1
            T-=sigma[j]
        STD_basis.append(list(v))
    
    S1=[STD_basis[0]]
    S2=[]
    for i in range(1,len(STD_basis)):
        v=STD_basis[i]
        flag=True
        for w in S1:
            if sum([v[j]*w[j] for j in range(0,n)])!=0:
                flag=False
                S1.append(list(v))
                break
        if flag:
            S2.append(list(v))
            
    if len(S2)==0:
        return False
    for v in S2:
        for w in S1:
            if sum([v[j]*w[j] for j in range(0,n)])!=0:
                return False
    return True

def norm(v):
    return sum([z*z for z in v])

def irred_check(v,vtest):
    #Computes T=(v-vtest).vtest returns true if this does not prove
    #that v is reducible. I.e returns true if T<0 or vtest=0 or v=vtest.

    T=sum([(v[i]-vtest[i])*vtest[i] for i in range(0,len(v))])
    if T<0:
        return True

    if T==0:
        if sum([z*z for z in vtest])==0:
            return True
        if sum([(v[i]-vtest[i])*(v[i]-vtest[i]) for i in range(0,len(v))])==0:
            return True
    return False
    
def vertex_bounds(sigma):
    #Provide bounds on the coefficients of a vertex in
    #in an OSB in a changemaker lattice.
    n=len(sigma)
    vmax=[0]*n
    p=norm(sigma)
    #Check if sigma is tight
    vmax[0]=1
    if is_tight(sigma):
        vmax[0]=2
    else:
        vmax[0]=1
    
    for i in range(1, len(sigma)):
        if sigma[i]==sigma[i-1]:
            vmax[i]=vmax[i-1]
            continue

        if sigma[i-1]==1 and sigma[i]>1:
            vmax[i]=sigma[i]
            continue   
        
        #If sigma[i] tight.
        if sigma[i]> sum([sigma[j] for j in range(0,i)]):
            vmax[i]=5+sum([vmax[j]+1 for j in range(0,i)])
        else:
            T=sigma[i]
            j=i-1
            while T>0:
                j=max([k for k in range(0,j+1) if sigma[k]<=T])
                vmax[i]=vmax[i]+vmax[j]+1
                T-=sigma[j]
    #Compute the bound coming from Cauchy-Schwartz inequality
    for i in range(1,len(sigma)):
        CS_bound= int(math.sqrt(p - sigma[i]*sigma[i]))
        vmax[i]=min(CS_bound, vmax[i])
    
    return vmax

def CM_generator(sigma, vmax):
    ##Iterates through all vectors in a changemaker lattice
    ##whose coordinates satisfy |v[i]|\leq vmax[i] for all i.
    n=len(sigma)
    
    v=[-vmax[i] for i in range(0,n)]
    k=0
    while True:
        #Check whether there is a choice final coordinate to
        #put vector in CM lattice. If so, yield that vector.
        t= sum([sigma[i]*v[i] for i in range(0,n-1)])
        if t%sigma[-1]==0:
            v[-1]=-t//sigma[-1]
            if v[-1]>=-vmax[-1] and v[-1]<=vmax[-1]:
                yield v
        #Now increment v.
        while k<n-1 and v[k]+1>vmax[k]:
            v[k]=-vmax[k]
            k=k+1
        if k<n-1:
            v[k]+=1
            k=0
        else:
            break
    
def list_vertices(sigma, quick=False):
    ##generate a list of candidate vertices with norm at least 3.
    ##If the quick flag is set to true, this does not
    ##generate precisely the set of all irreducibles.
    p=norm(sigma)
    n=len(sigma)
    irred_list=[]
    equal_list=[]
    
    #Vector defining the bounds on the search space
    vmax=vertex_bounds(sigma)

    #Modify vmax if we are doing a quick search
    if quick:
        vmax=[min(2, vmax[i]) for i in range(0,n)]
        for i in range(0,n):
            if sigma[i]==sigma[-1]:
                vmax[i]=1
    
    for k in range(1,sigma[-1]+1):
        if sigma.count(k)>1:
            equal_list.append([i for i in range(0,n) if sigma[i]==k])
    
    for v in CM_generator(sigma,vmax):
        #Skip vectors of norm  less than 2.
        if norm(v)<=2:# or norm_calc>p:
            continue
        v_irred_flag=True
        #Check whether there is a vertex of norm 2 which
        #shows reducibility
        for clist in equal_list:
            mini=min([v[i] for i in clist])
            maxi=max([v[i] for i in clist])
            if maxi>mini+1:
                v_irred_flag=False
                break
        ##Finally compare v against all other potential irreducibles.
        if v_irred_flag:
            for vtest in irred_list:
                if irred_check(v,vtest)==False:
                    v_irred_flag=False
                    break
        #if v is potentially irreducible, we use it filter out any
        #non-irreducibles in irred_list and add it to irred_list.
        if v_irred_flag:
            irred_list=[w for w in irred_list if irred_check(w,v)]
            irred_list+=[list(v)]
    return irred_list

def obtuse_check(Q,n):
    if min(sum(Q))<0:
        return False
        
    for i in range(0,n-1):
        for j in range(0,i):
            if Q[i,j]>0:
                return False
    return True
    

def OSB_search(sigma, quick=False):
    ##Search for an obtuse superbase. Function returns an OSB
    #if it finds one. Returns false otherwise. The optional flag quick
    ##can be used to accelerate the search. When true the flag restricts
    ##the search of irreducibles to vectors with coefficients at most 2.
    ##Conjecturally, this is should still always find an OSB if it exists.
    ##However, we can only rigourously rule out the existence of
    ##an OSB if we run the algorithm with the quick flag set to False.
    ##This implementation is improved
    ## adding norm 2 vertices to the basis at the start

    p=norm(sigma)
    n=len(sigma)
    
    #Create a list of norm 2 vectors that we will put in our basis.
    norm2_vertices=[]
    for i in range(1,n):
        if sigma[i]==sigma[i-1]:
            z=[0]*n
            z[i]=1
            z[i-1]=-1
            norm2_vertices+=[list(z)]

    #Filter our set of irreducibles by picking those with norm >2 and
    #pairing 0 or -1 with the norm two vectors
    vertex_pool=[]
    for z in list_vertices(sigma,quick):
        t=[sum([w[i]*z[i] for i in range(0,n)]) for w in norm2_vertices]
        if len(t)==0 or (min(t)>=-1 and max(t)<=0):
            vertex_pool+=[z]

    #Now consider all possible combinations of vertices.
    #Uses combinations from itertools package.
    for t in combinations(vertex_pool,n-len(norm2_vertices)-1):
        vertex_list=norm2_vertices+list(t)
        M=np.asarray(vertex_list)
        
        #Calculate intersection matrix
        Q=np.matmul(M,M.transpose())
        
        #Check that this is a basis by computing determinant of Q.
        #The det function in numpy doesn't seem to do integer
        #calculations.
        det=np.linalg.det(Q)
        if obtuse_check(Q,n) and det>p-0.5 and det<p+0.5:
            return Q
    return []

def adhoc_tests(stable_coefs):
    ##Some tests for whether a given set of cable coefficients
    ##can possibly support an OSB. Returns false if there cannot
    ##exist an OSB. Returns true if inconclusive. These methods
    ##are not necessary they are simply used to accelerate running
    ##times.
    stable=sorted(stable_coefs)
    ##If the stable coefficents contain 4,4,4,4,3,3,2 then
    ##there is no OSB.
    if stable.count(4)>=4 and stable.count(3)>=2 and stable.count(2)>=1:
        return False

    ##If the stable coefficents contain 3,3,3,3,2,2,2 then
    ##there is no OSB.
    if stable.count(3)>=4 and stable.count(2)>=3:
        return False
    ##The obstruction based on Corollary ?? from the paper.
    for k in range(0,len(stable)-1):
        N=stable.count(stable[k])
        if N>=4 and (N-1)*stable[k]>stable[k+1]>stable[k]:
            return False

    return True

def find_OSB_slopes(stable_coefs):
    ##Input the stable coefficients. Returns a rigourously verified
    ##list of coefficients for which there is an OSB along
    ##with a gram matrix for each OSB.
    output=[]
    if adhoc_tests(stable_coefs)==False:
        return output
    
    stable=sorted(stable_coefs)

    ##Check whether these stable coefficients support a decomposable lattice.
    decomposable= stable_is_decomposable(stable)

    slopes=[]
    ##Work out which slopes can conceivably admit an OSB.
    if decomposable:
        slopes=[0,1,2]
    elif is_CM([1]*(stable[0]-1)+stable):
        slopes=[0,1]
    else:
        slopes=[1,2]
    
    #First perform a quick search to find OSBs with small coefficients.
    for k in slopes:
        sigma=[1]*k+[1]*(stable[0]-1)+stable
        n=norm(sigma)
        
        if is_CM(sigma):
            ##First run a quick search
            result=OSB_search(sigma,quick=True)
            if len(result)>0:
                output+=[[n,result]]
            else:
                ##If an OSB not found quickly, run a full search instead.
                result=OSB_search(sigma, quick=False)
                if len(result)>0:
                    output+=[[n,result]]
            
    return output
In [2]:
stable_coefficients=[['BL_knot:[1, 1, 1, 1, 0]', [12, 9, 5, 4, 2]],
 ['BL_knot:[1, 1, 0, 1, 1]', [16, 12, 7, 4, 2]],
 ['BL_knot:[1, 1, 1, 2, 0]', [12, 12, 9, 5, 4, 2]],
 ['BL_knot:[1, 1, 2, 1, 0]', [17, 14, 5, 5, 4, 2]],
 ['BL_knot:[1, 2, 1, 1, 0]', [17, 13, 7, 6, 3]],
 ['BL_knot:[2, 1, 1, 1, 0]', [18, 13, 7, 6, 2, 2]],
 ['BL_knot:[1, 1, 1, 1, 1]', [26, 17, 12, 5, 4, 2]],
 ['BL_knot:[1, 1, 0, 2, 1]', [23, 19, 7, 7, 4, 2]],
 ['BL_knot:[1, 2, 0, 1, 1]', [23, 17, 10, 6, 3]],
 ['BL_knot:[1, 1, 2, 2, 0]', [17, 17, 14, 5, 5, 4, 2]],
 ['BL_knot:[1, 2, 1, 2, 0]', [17, 17, 13, 7, 6, 3]],
 ['BL_knot:[2, 1, 1, 2, 0]', [18, 18, 13, 7, 6, 2, 2]],
 ['BL_knot:[1, 1, 0, 1, 2]', [28, 12, 12, 7, 4, 2]],
 ['BL_knot:[2, 1, 0, 1, 1]', [24, 18, 11, 6, 2, 2]]]
In [3]:
start_time = time.time()
GOERITZ=[]

for [knot,stable] in stable_coefficients:
    goeritz=find_OSB_slopes(stable)
    print(knot)
    print(goeritz)
    GOERITZ.append([knot, stable,goeritz])

print("--- Time taken: %s seconds ---" % ((time.time() - start_time)))
BL_knot:[1, 1, 1, 1, 0]
[[271, array([[ 4,  0, -2,  0, -1],
       [ 0,  3,  0,  0, -2],
       [-2,  0,  4, -1, -1],
       [ 0,  0, -1,  3, -1],
       [-1, -2, -1, -1,  6]])], [272, array([[ 2,  0,  0,  0, -1,  0],
       [ 0,  4,  0, -1, -1, -1],
       [ 0,  0,  3,  0,  0, -2],
       [ 0, -1,  0,  3, -1, -1],
       [-1, -1,  0, -1,  3,  0],
       [ 0, -1, -2, -1,  0,  5]])]]
BL_knot:[1, 1, 0, 1, 1]
[[470, array([[ 5,  0, -1, -1, -2],
       [ 0,  4, -1, -1, -2],
       [-1, -1,  5, -1, -1],
       [-1, -1, -1,  4,  0],
       [-2, -2, -1,  0,  5]])], [471, array([[ 2,  0, -1,  0,  0,  0],
       [ 0,  3, -1,  0, -1, -1],
       [-1, -1,  4,  0, -1, -1],
       [ 0,  0,  0,  3, -1, -1],
       [ 0, -1, -1, -1,  4, -1],
       [ 0, -1, -1, -1, -1,  6]])]]
BL_knot:[1, 1, 1, 2, 0]
[[415, array([[ 2,  0,  0,  0,  0, -1],
       [ 0,  6, -1, -1, -2, -1],
       [ 0, -1,  3, -1,  0,  0],
       [ 0, -1, -1,  4,  0, -2],
       [ 0, -2,  0,  0,  3,  0],
       [-1, -1,  0, -2,  0,  4]])], [416, array([[ 2,  0,  0, -1,  0,  0,  0],
       [ 0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  5,  0, -1, -2, -1],
       [-1,  0,  0,  3, -1,  0, -1],
       [ 0,  0, -1, -1,  3,  0, -1],
       [ 0,  0, -2,  0,  0,  3,  0],
       [ 0, -1, -1, -1, -1,  0,  4]])]]
BL_knot:[1, 1, 2, 1, 0]
[[556, array([[ 2,  0,  0, -1, -1,  0],
       [ 0,  4,  0, -2,  0, -1],
       [ 0,  0,  4,  0,  0, -3],
       [-1, -2,  0,  4,  0, -1],
       [-1,  0,  0,  0,  3, -1],
       [ 0, -1, -3, -1, -1,  7]])], [557, array([[ 2,  0,  0,  0,  0, -1,  0],
       [ 0,  2, -1,  0,  0, -1,  0],
       [ 0, -1,  4,  0, -1,  0, -1],
       [ 0,  0,  0,  4,  0,  0, -3],
       [ 0,  0, -1,  0,  3, -1, -1],
       [-1, -1,  0,  0, -1,  3,  0],
       [ 0,  0, -1, -3, -1,  0,  6]])]]
BL_knot:[1, 2, 1, 1, 0]
[[554, array([[ 2,  0,  0,  0, -1,  0],
       [ 0,  5,  0, -3,  0, -1],
       [ 0,  0,  3,  0,  0, -2],
       [ 0, -3,  0,  5, -1, -1],
       [-1,  0,  0, -1,  3, -1],
       [ 0, -1, -2, -1, -1,  6]])], [555, array([[ 2, -1,  0,  0,  0,  0,  0],
       [-1,  2,  0,  0,  0, -1,  0],
       [ 0,  0,  4,  0, -1, -1, -1],
       [ 0,  0,  0,  3,  0,  0, -2],
       [ 0,  0, -1,  0,  4, -1, -2],
       [ 0, -1, -1,  0, -1,  3,  0],
       [ 0,  0, -1, -2, -2,  0,  6]])]]
BL_knot:[2, 1, 1, 1, 0]
[[587, array([[ 2,  0,  0, -1,  0, -1],
       [ 0,  4,  0, -2,  0, -1],
       [ 0,  0,  3,  0,  0, -2],
       [-1, -2,  0,  4, -1,  0],
       [ 0,  0,  0, -1,  3, -1],
       [-1, -1, -2,  0, -1,  7]])], [588, array([[ 2,  0,  0,  0,  0, -1,  0],
       [ 0,  2, -1,  0, -1,  0,  0],
       [ 0, -1,  4,  0,  0, -1, -1],
       [ 0,  0,  0,  3,  0,  0, -2],
       [ 0, -1,  0,  0,  3, -1, -1],
       [-1,  0, -1,  0, -1,  3,  0],
       [ 0,  0, -1, -2, -1,  0,  6]])]]
BL_knot:[1, 1, 1, 1, 1]
[[1155, array([[ 5,  0, -1, -2, -1,  0],
       [ 0,  4, -1,  0, -1, -2],
       [-1, -1,  5, -1, -1,  0],
       [-2,  0, -1,  4,  0, -1],
       [-1, -1, -1,  0,  5,  0],
       [ 0, -2,  0, -1,  0,  3]])], [1156, array([[ 2,  0, -1,  0,  0, -1,  0],
       [ 0,  5,  0, -1, -1, -1, -1],
       [-1,  0,  4,  0, -1,  0, -2],
       [ 0, -1,  0,  4, -1, -1,  0],
       [ 0, -1, -1, -1,  3,  0,  0],
       [-1, -1,  0, -1,  0,  5,  0],
       [ 0, -1, -2,  0,  0,  0,  3]])]]
BL_knot:[1, 1, 0, 2, 1]
[[1009, array([[ 2, -1,  0,  0, -1,  0],
       [-1,  5,  0, -1,  0, -2],
       [ 0,  0,  5, -1, -1, -3],
       [ 0, -1, -1,  5, -1, -1],
       [-1,  0, -1, -1,  4,  0],
       [ 0, -2, -3, -1,  0,  6]])], [1010, array([[ 2,  0,  0, -1,  0,  0,  0],
       [ 0,  2,  0, -1,  0,  0, -1],
       [ 0,  0,  3, -1,  0, -1, -1],
       [-1, -1, -1,  4,  0, -1,  0],
       [ 0,  0,  0,  0,  3, -1, -1],
       [ 0,  0, -1, -1, -1,  4, -1],
       [ 0, -1, -1,  0, -1, -1,  7]])]]
BL_knot:[1, 2, 0, 1, 1]
[[965, array([[ 2,  0, -1,  0, -1,  0],
       [ 0,  6,  0, -1, -1, -3],
       [-1,  0,  4, -1,  0, -2],
       [ 0, -1, -1,  5, -1, -1],
       [-1, -1,  0, -1,  4,  0],
       [ 0, -3, -2, -1,  0,  6]])], [966, array([[ 2, -1,  0, -1,  0,  0,  0],
       [-1,  2,  0,  0,  0,  0,  0],
       [ 0,  0,  3, -1,  0, -1, -1],
       [-1,  0, -1,  4,  0, -1, -1],
       [ 0,  0,  0,  0,  4, -2, -1],
       [ 0,  0, -1, -1, -2,  5, -1],
       [ 0,  0, -1, -1, -1, -1,  6]])]]
BL_knot:[1, 1, 2, 2, 0]
[[845, array([[ 2,  0,  0, -1, -1,  0,  0],
       [ 0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  7, -1, -1, -3, -1],
       [-1,  0, -1,  3,  0,  0,  0],
       [-1,  0, -1,  0,  4,  0, -2],
       [ 0,  0, -3,  0,  0,  4,  0],
       [ 0, -1, -1,  0, -2,  0,  4]])], [846, array([[ 2,  0,  0,  0, -1,  0,  0,  0],
       [ 0,  2,  0,  0, -1,  0,  0, -1],
       [ 0,  0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  0,  6,  0, -1, -3, -1],
       [-1, -1,  0,  0,  3, -1,  0,  0],
       [ 0,  0,  0, -1, -1,  3,  0, -1],
       [ 0,  0,  0, -3,  0,  0,  4,  0],
       [ 0, -1, -1, -1,  0, -1,  0,  4]])]]
BL_knot:[1, 2, 1, 2, 0]
[[843, array([[ 2,  0,  0, -1,  0,  0,  0],
       [ 0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  6, -1, -1, -2, -1],
       [-1,  0, -1,  3, -1,  0,  0],
       [ 0,  0, -1, -1,  5,  0, -3],
       [ 0,  0, -2,  0,  0,  3,  0],
       [ 0, -1, -1,  0, -3,  0,  5]])], [844, array([[ 2, -1,  0,  0, -1,  0,  0,  0],
       [-1,  2,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  0,  6,  0, -2, -2, -1],
       [-1,  0,  0,  0,  3, -1,  0, -1],
       [ 0,  0,  0, -2, -1,  4,  0, -1],
       [ 0,  0,  0, -2,  0,  0,  3,  0],
       [ 0,  0, -1, -1, -1, -1,  0,  4]])]]
BL_knot:[2, 1, 1, 2, 0]
[[911, array([[ 2,  0, -1,  0, -1,  0,  0],
       [ 0,  2,  0,  0,  0,  0, -1],
       [-1,  0,  7, -1,  0, -2, -1],
       [ 0,  0, -1,  3, -1,  0,  0],
       [-1,  0,  0, -1,  4,  0, -2],
       [ 0,  0, -2,  0,  0,  3,  0],
       [ 0, -1, -1,  0, -2,  0,  4]])], [912, array([[ 2,  0,  0,  0, -1,  0,  0,  0],
       [ 0,  2,  0,  0,  0, -1,  0, -1],
       [ 0,  0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  0,  6,  0, -1, -2, -1],
       [-1,  0,  0,  0,  3, -1,  0, -1],
       [ 0, -1,  0, -1, -1,  3,  0,  0],
       [ 0,  0,  0, -2,  0,  0,  3,  0],
       [ 0, -1, -1, -1, -1,  0,  0,  4]])]]
BL_knot:[1, 1, 0, 1, 2]
[[1142, array([[ 2,  0, -1,  0,  0, -1],
       [ 0,  6,  0, -1, -1, -2],
       [-1,  0,  4, -1, -1, -1],
       [ 0, -1, -1,  5, -1, -1],
       [ 0, -1, -1, -1,  4,  0],
       [-1, -2, -1, -1,  0,  5]])], [1143, array([[ 2,  0,  0, -1,  0,  0, -1],
       [ 0,  2,  0,  0,  0,  0, -1],
       [ 0,  0,  4, -1,  0, -1,  0],
       [-1,  0, -1,  4,  0, -1,  0],
       [ 0,  0,  0,  0,  3, -1, -1],
       [ 0,  0, -1, -1, -1,  4,  0],
       [-1, -1,  0,  0, -1,  0,  4]])]]
BL_knot:[2, 1, 0, 1, 1]
[[1066, array([[ 2,  0,  0, -1,  0, -1],
       [ 0,  5,  0, -1, -1, -2],
       [ 0,  0,  4, -1, -1, -2],
       [-1, -1, -1,  6, -2,  0],
       [ 0, -1, -1, -2,  5,  0],
       [-1, -2, -2,  0,  0,  5]])], [1067, array([[ 2,  0,  0, -1,  0,  0,  0],
       [ 0,  2,  0,  0, -1,  0, -1],
       [ 0,  0,  3, -1,  0, -1, -1],
       [-1,  0, -1,  5,  0, -2, -1],
       [ 0, -1,  0,  0,  3, -1,  0],
       [ 0,  0, -1, -2, -1,  5, -1],
       [ 0, -1, -1, -1,  0, -1,  6]])]]
--- Time taken: 36608.94345998764 seconds ---
In [4]:
GOERITZ
Out[4]:
[['BL_knot:[1, 1, 1, 1, 0]',
  [12, 9, 5, 4, 2],
  [[271,
    array([[ 4,  0, -2,  0, -1],
           [ 0,  3,  0,  0, -2],
           [-2,  0,  4, -1, -1],
           [ 0,  0, -1,  3, -1],
           [-1, -2, -1, -1,  6]])],
   [272,
    array([[ 2,  0,  0,  0, -1,  0],
           [ 0,  4,  0, -1, -1, -1],
           [ 0,  0,  3,  0,  0, -2],
           [ 0, -1,  0,  3, -1, -1],
           [-1, -1,  0, -1,  3,  0],
           [ 0, -1, -2, -1,  0,  5]])]]],
 ['BL_knot:[1, 1, 0, 1, 1]',
  [16, 12, 7, 4, 2],
  [[470,
    array([[ 5,  0, -1, -1, -2],
           [ 0,  4, -1, -1, -2],
           [-1, -1,  5, -1, -1],
           [-1, -1, -1,  4,  0],
           [-2, -2, -1,  0,  5]])],
   [471,
    array([[ 2,  0, -1,  0,  0,  0],
           [ 0,  3, -1,  0, -1, -1],
           [-1, -1,  4,  0, -1, -1],
           [ 0,  0,  0,  3, -1, -1],
           [ 0, -1, -1, -1,  4, -1],
           [ 0, -1, -1, -1, -1,  6]])]]],
 ['BL_knot:[1, 1, 1, 2, 0]',
  [12, 12, 9, 5, 4, 2],
  [[415,
    array([[ 2,  0,  0,  0,  0, -1],
           [ 0,  6, -1, -1, -2, -1],
           [ 0, -1,  3, -1,  0,  0],
           [ 0, -1, -1,  4,  0, -2],
           [ 0, -2,  0,  0,  3,  0],
           [-1, -1,  0, -2,  0,  4]])],
   [416,
    array([[ 2,  0,  0, -1,  0,  0,  0],
           [ 0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  5,  0, -1, -2, -1],
           [-1,  0,  0,  3, -1,  0, -1],
           [ 0,  0, -1, -1,  3,  0, -1],
           [ 0,  0, -2,  0,  0,  3,  0],
           [ 0, -1, -1, -1, -1,  0,  4]])]]],
 ['BL_knot:[1, 1, 2, 1, 0]',
  [17, 14, 5, 5, 4, 2],
  [[556,
    array([[ 2,  0,  0, -1, -1,  0],
           [ 0,  4,  0, -2,  0, -1],
           [ 0,  0,  4,  0,  0, -3],
           [-1, -2,  0,  4,  0, -1],
           [-1,  0,  0,  0,  3, -1],
           [ 0, -1, -3, -1, -1,  7]])],
   [557,
    array([[ 2,  0,  0,  0,  0, -1,  0],
           [ 0,  2, -1,  0,  0, -1,  0],
           [ 0, -1,  4,  0, -1,  0, -1],
           [ 0,  0,  0,  4,  0,  0, -3],
           [ 0,  0, -1,  0,  3, -1, -1],
           [-1, -1,  0,  0, -1,  3,  0],
           [ 0,  0, -1, -3, -1,  0,  6]])]]],
 ['BL_knot:[1, 2, 1, 1, 0]',
  [17, 13, 7, 6, 3],
  [[554,
    array([[ 2,  0,  0,  0, -1,  0],
           [ 0,  5,  0, -3,  0, -1],
           [ 0,  0,  3,  0,  0, -2],
           [ 0, -3,  0,  5, -1, -1],
           [-1,  0,  0, -1,  3, -1],
           [ 0, -1, -2, -1, -1,  6]])],
   [555,
    array([[ 2, -1,  0,  0,  0,  0,  0],
           [-1,  2,  0,  0,  0, -1,  0],
           [ 0,  0,  4,  0, -1, -1, -1],
           [ 0,  0,  0,  3,  0,  0, -2],
           [ 0,  0, -1,  0,  4, -1, -2],
           [ 0, -1, -1,  0, -1,  3,  0],
           [ 0,  0, -1, -2, -2,  0,  6]])]]],
 ['BL_knot:[2, 1, 1, 1, 0]',
  [18, 13, 7, 6, 2, 2],
  [[587,
    array([[ 2,  0,  0, -1,  0, -1],
           [ 0,  4,  0, -2,  0, -1],
           [ 0,  0,  3,  0,  0, -2],
           [-1, -2,  0,  4, -1,  0],
           [ 0,  0,  0, -1,  3, -1],
           [-1, -1, -2,  0, -1,  7]])],
   [588,
    array([[ 2,  0,  0,  0,  0, -1,  0],
           [ 0,  2, -1,  0, -1,  0,  0],
           [ 0, -1,  4,  0,  0, -1, -1],
           [ 0,  0,  0,  3,  0,  0, -2],
           [ 0, -1,  0,  0,  3, -1, -1],
           [-1,  0, -1,  0, -1,  3,  0],
           [ 0,  0, -1, -2, -1,  0,  6]])]]],
 ['BL_knot:[1, 1, 1, 1, 1]',
  [26, 17, 12, 5, 4, 2],
  [[1155,
    array([[ 5,  0, -1, -2, -1,  0],
           [ 0,  4, -1,  0, -1, -2],
           [-1, -1,  5, -1, -1,  0],
           [-2,  0, -1,  4,  0, -1],
           [-1, -1, -1,  0,  5,  0],
           [ 0, -2,  0, -1,  0,  3]])],
   [1156,
    array([[ 2,  0, -1,  0,  0, -1,  0],
           [ 0,  5,  0, -1, -1, -1, -1],
           [-1,  0,  4,  0, -1,  0, -2],
           [ 0, -1,  0,  4, -1, -1,  0],
           [ 0, -1, -1, -1,  3,  0,  0],
           [-1, -1,  0, -1,  0,  5,  0],
           [ 0, -1, -2,  0,  0,  0,  3]])]]],
 ['BL_knot:[1, 1, 0, 2, 1]',
  [23, 19, 7, 7, 4, 2],
  [[1009,
    array([[ 2, -1,  0,  0, -1,  0],
           [-1,  5,  0, -1,  0, -2],
           [ 0,  0,  5, -1, -1, -3],
           [ 0, -1, -1,  5, -1, -1],
           [-1,  0, -1, -1,  4,  0],
           [ 0, -2, -3, -1,  0,  6]])],
   [1010,
    array([[ 2,  0,  0, -1,  0,  0,  0],
           [ 0,  2,  0, -1,  0,  0, -1],
           [ 0,  0,  3, -1,  0, -1, -1],
           [-1, -1, -1,  4,  0, -1,  0],
           [ 0,  0,  0,  0,  3, -1, -1],
           [ 0,  0, -1, -1, -1,  4, -1],
           [ 0, -1, -1,  0, -1, -1,  7]])]]],
 ['BL_knot:[1, 2, 0, 1, 1]',
  [23, 17, 10, 6, 3],
  [[965,
    array([[ 2,  0, -1,  0, -1,  0],
           [ 0,  6,  0, -1, -1, -3],
           [-1,  0,  4, -1,  0, -2],
           [ 0, -1, -1,  5, -1, -1],
           [-1, -1,  0, -1,  4,  0],
           [ 0, -3, -2, -1,  0,  6]])],
   [966,
    array([[ 2, -1,  0, -1,  0,  0,  0],
           [-1,  2,  0,  0,  0,  0,  0],
           [ 0,  0,  3, -1,  0, -1, -1],
           [-1,  0, -1,  4,  0, -1, -1],
           [ 0,  0,  0,  0,  4, -2, -1],
           [ 0,  0, -1, -1, -2,  5, -1],
           [ 0,  0, -1, -1, -1, -1,  6]])]]],
 ['BL_knot:[1, 1, 2, 2, 0]',
  [17, 17, 14, 5, 5, 4, 2],
  [[845,
    array([[ 2,  0,  0, -1, -1,  0,  0],
           [ 0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  7, -1, -1, -3, -1],
           [-1,  0, -1,  3,  0,  0,  0],
           [-1,  0, -1,  0,  4,  0, -2],
           [ 0,  0, -3,  0,  0,  4,  0],
           [ 0, -1, -1,  0, -2,  0,  4]])],
   [846,
    array([[ 2,  0,  0,  0, -1,  0,  0,  0],
           [ 0,  2,  0,  0, -1,  0,  0, -1],
           [ 0,  0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  0,  6,  0, -1, -3, -1],
           [-1, -1,  0,  0,  3, -1,  0,  0],
           [ 0,  0,  0, -1, -1,  3,  0, -1],
           [ 0,  0,  0, -3,  0,  0,  4,  0],
           [ 0, -1, -1, -1,  0, -1,  0,  4]])]]],
 ['BL_knot:[1, 2, 1, 2, 0]',
  [17, 17, 13, 7, 6, 3],
  [[843,
    array([[ 2,  0,  0, -1,  0,  0,  0],
           [ 0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  6, -1, -1, -2, -1],
           [-1,  0, -1,  3, -1,  0,  0],
           [ 0,  0, -1, -1,  5,  0, -3],
           [ 0,  0, -2,  0,  0,  3,  0],
           [ 0, -1, -1,  0, -3,  0,  5]])],
   [844,
    array([[ 2, -1,  0,  0, -1,  0,  0,  0],
           [-1,  2,  0,  0,  0,  0,  0,  0],
           [ 0,  0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  0,  6,  0, -2, -2, -1],
           [-1,  0,  0,  0,  3, -1,  0, -1],
           [ 0,  0,  0, -2, -1,  4,  0, -1],
           [ 0,  0,  0, -2,  0,  0,  3,  0],
           [ 0,  0, -1, -1, -1, -1,  0,  4]])]]],
 ['BL_knot:[2, 1, 1, 2, 0]',
  [18, 18, 13, 7, 6, 2, 2],
  [[911,
    array([[ 2,  0, -1,  0, -1,  0,  0],
           [ 0,  2,  0,  0,  0,  0, -1],
           [-1,  0,  7, -1,  0, -2, -1],
           [ 0,  0, -1,  3, -1,  0,  0],
           [-1,  0,  0, -1,  4,  0, -2],
           [ 0,  0, -2,  0,  0,  3,  0],
           [ 0, -1, -1,  0, -2,  0,  4]])],
   [912,
    array([[ 2,  0,  0,  0, -1,  0,  0,  0],
           [ 0,  2,  0,  0,  0, -1,  0, -1],
           [ 0,  0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  0,  6,  0, -1, -2, -1],
           [-1,  0,  0,  0,  3, -1,  0, -1],
           [ 0, -1,  0, -1, -1,  3,  0,  0],
           [ 0,  0,  0, -2,  0,  0,  3,  0],
           [ 0, -1, -1, -1, -1,  0,  0,  4]])]]],
 ['BL_knot:[1, 1, 0, 1, 2]',
  [28, 12, 12, 7, 4, 2],
  [[1142,
    array([[ 2,  0, -1,  0,  0, -1],
           [ 0,  6,  0, -1, -1, -2],
           [-1,  0,  4, -1, -1, -1],
           [ 0, -1, -1,  5, -1, -1],
           [ 0, -1, -1, -1,  4,  0],
           [-1, -2, -1, -1,  0,  5]])],
   [1143,
    array([[ 2,  0,  0, -1,  0,  0, -1],
           [ 0,  2,  0,  0,  0,  0, -1],
           [ 0,  0,  4, -1,  0, -1,  0],
           [-1,  0, -1,  4,  0, -1,  0],
           [ 0,  0,  0,  0,  3, -1, -1],
           [ 0,  0, -1, -1, -1,  4,  0],
           [-1, -1,  0,  0, -1,  0,  4]])]]],
 ['BL_knot:[2, 1, 0, 1, 1]',
  [24, 18, 11, 6, 2, 2],
  [[1066,
    array([[ 2,  0,  0, -1,  0, -1],
           [ 0,  5,  0, -1, -1, -2],
           [ 0,  0,  4, -1, -1, -2],
           [-1, -1, -1,  6, -2,  0],
           [ 0, -1, -1, -2,  5,  0],
           [-1, -2, -2,  0,  0,  5]])],
   [1067,
    array([[ 2,  0,  0, -1,  0,  0,  0],
           [ 0,  2,  0,  0, -1,  0, -1],
           [ 0,  0,  3, -1,  0, -1, -1],
           [-1,  0, -1,  5,  0, -2, -1],
           [ 0, -1,  0,  0,  3, -1,  0],
           [ 0,  0, -1, -2, -1,  5, -1],
           [ 0, -1, -1, -1,  0, -1,  6]])]]]]